/**
 * 网络请求封装（uni-app优化版）
 */
import md5 from 'md5'
import {
	getToken,
	handleLoginExpired
} from './auth.js'
// 默认配置
const defaults = {
	version: "2.1.11",
	from: 'uniapp',
	async: true,
	accept_language: "Chinese",
	types: "post",
	baseUrl: 'https://api.youpin91.com/', // API接口服务器地址
	dataType: "json",
	datas: {},
	debug: false,
	imgurl: 'http://static.youpin91.com/',
	vediourl: 'http://static.youpin91.com/',
	token: '',
	server_address: 'https://weixin.youpin91.com.cn/' // 赋值链接时候使用的服务器地址
}

// 请求拦截器
const requestInterceptor = (config) => {
	// 这里可以对请求配置进行修改，比如添加通用header等
	return config
}

// 响应拦截器
const responseInterceptor = (response) => {
	// 这里可以对响应数据进行处理
	return response
}

// 错误处理
const errorHandler = (error) => {
	// 处理请求错误
	uni.showToast({
		title: '网络异常，请检查网络',
		icon: 'none'
	})
	return Promise.reject(error)
}

/**
 * 检查网络状态（uni-app和小程序兼容方案）
 */
const checkNetworkStatus = () => {
	return new Promise((resolve, reject) => {
		// uni-app环境使用uni.getNetworkType
		if (typeof uni !== 'undefined' && uni.getNetworkType) {
			uni.getNetworkType({
				success: (res) => {
					if (res.networkType === 'none') {
						uni.showToast({
							title: '网络异常，请检查网络',
							icon: 'none'
						})
						reject(new Error('网络异常'))
					} else {
						resolve()
					}
				},
				fail: () => {
					// 获取网络状态失败也继续请求
					resolve()
				}
			})
		}
		// 浏览器环境使用navigator.onLine
		else if (typeof navigator !== 'undefined' && navigator.onLine === false) {
			uni.showToast({
				title: '网络异常，请检查网络',
				icon: 'none'
			})
			reject(new Error('网络异常'))
		}
		// 其他环境直接继续
		else {
			resolve()
		}
	})
}

/**
 * 发起网络请求
 * @param {Object} options - 请求配置
 * @returns {Promise} - 返回Promise对象
 */
const request = async (options) => {
	try {
		// 检查网络状态
		await checkNetworkStatus()

		// 合并配置
		const opt = Object.assign({}, defaults, options)
		// 构建完整URL
		const tempUrl = opt.baseUrl + (options.url || '')
		opt.url = tempUrl

		// 调试信息：打印请求参数
		if (options.showLog) {
			console.log('=== request.js 调试信息 ===')
			console.log('请求URL:', opt.url)
			console.log('请求参数 opt.datas:', JSON.stringify(opt.datas, null, 2))
			console.log('参数中的mobile:', opt.datas.mobile)
			console.log('参数中的pwd:', opt.datas.pwd)
			console.log('参数中的invite_code:', opt.datas.invite_code)
		}

		// 构建参数字符串用于签名
		let params = ''
		const param_arr = Object.keys(opt.datas).sort()
		// console.log('签名参数键名排序后:', param_arr)
		for (const key of param_arr) {
			const value = opt.datas[key]
			params += key + '=' + value
			// console.log(`签名参数: ${key}=${value}`)
		}
		// console.log('完整签名字符串:', params)

		// 生成时间戳和签名
		const date = Date.now() / 1000
		const sign = md5(params)
		// console.log('生成的签名:', sign)

		const header = {
			'rp': 3,
			'ts': date,
			'sign': sign,
			'client': opt.client ? opt.client : 1,
			'token': opt.token || getToken()
		}
		// console.log('请求头:', JSON.stringify(header, null, 2))

		// 应用请求拦截器
		const config = requestInterceptor({
			url: opt.url,
			data: opt.datas,
			method: 'POST',
			header: header,
			dataType: opt.dataType
		})

		// 显示加载提示
		if (opt.showLoading !== false) {
			uni.showLoading({
				title: '加载中...',
				mask: true
			})
		}

		// 发起请求
		return new Promise((resolve, reject) => {
			uni.request({
				...config,
				success: (res) => {
					// 隐藏加载提示
					if (opt.showLoading !== false) {
						uni.hideLoading()
					}

					// 调试信息：打印响应数据
					if (options.showLog) {
						console.log('=== API响应数据 ===')
						console.log('响应状态码:', res.statusCode)
						console.log('响应数据:', JSON.stringify(res.data, null, 2))
					}
					
					// 处理登录失效
					if (res.data && res.data.r === -1000) {
						const tk = getToken()
						// 已登录：token 失效，弹窗并中断
						if (tk) {
							handleLoginExpired()
							return reject(new Error('登录已过期'))
						}
						// 未登录：不弹窗，把响应交给页面自行处理
						return resolve(res.data)
					}
					
					// 应用响应拦截器
					try {
						const response = responseInterceptor(res.data)
						resolve(response)
					} catch (e) {
						reject(e)
					}
				},
				fail: (err) => {
					// 隐藏加载提示
					if (opt.showLoading !== false) {
						uni.hideLoading()
					}

					// 处理错误
					const error = errorHandler(err)
					reject(error)
				}
			})
		})
	} catch (err) {
		return Promise.reject(err)
	}
}

/**
 * 上传图片（uni-app优化版）
 * @param {Object} options - 上传配置
 * @returns {Promise} - 返回Promise对象
 */
const uploadImage = (options) => {
	return new Promise((resolve, reject) => {
		const {
			filePath,
			formData = {},
			name = 'file'
		} = options

		// 先检查网络状态
		checkNetworkStatus()
			.then(() => {
				uni.showLoading({
					title: '上传中...',
					mask: true
				})

				uni.uploadFile({
					url: defaults.baseUrl + 'home/Upload/upload_img_wx',
					filePath: filePath,
					name: name,
					formData: formData,
					success: (res) => {
						uni.hideLoading()

						if (res.statusCode === 200) {
							try {
								const data = typeof res.data === 'string' ? JSON.parse(res
									.data) : res.data
								if (data && data.r === 0) {
									resolve(data.data.file_path[0])
								} else {
									reject(new Error(data.msg || '上传失败'))
								}
							} catch (e) {
								reject(new Error('解析响应数据失败'))
							}
						} else {
							reject(new Error(`上传失败，状态码: ${res.statusCode}`))
						}
					},
					fail: (err) => {
						uni.hideLoading()
						reject(err)
					}
				})
			})
			.catch(err => {
				reject(err)
			})
	})
}

export default {
	request,
	uploadImage,
	defaults
}